﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using pttk_htt_hr.DAO;
using pttk_htt_hr.Constant;
using pttk_htt_hr.DTO;
using pttk_htt_hr.Utility;

namespace pttk_htt_hr.DAO
{
    class ChiTietPhieuLapThucDonTuanToiDAO
    {
        #region Select

        public static List<Dictionary<string, string>> Lay_DanhSach_LstDic_ChiTietPhieuLapThucDonTuanToi(List<SqlParameter> parameters)
        {
            DBMS dbms = new DBMS();
            dbms.Connect();

            ChiTietPhieuLapThucDonTuanToiDTO ctpltdtt;

            DataTable dt = dbms.ExcuteProcedure_Select_DataTable(StoreProcedureConstant.SP_SELECT_CHI_TIET_PHIEU_LAP_TD_TUAN_TOI, parameters.ToArray());

            List<Dictionary<string, string>> Lst_ChiTietPhieuLapThucDonTuanToi = new List<Dictionary<string, string>>();

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                DataRow dr = dt.Rows[i];
                Dictionary<string, string> row = new Dictionary<string, string>();
                ctpltdtt = new ChiTietPhieuLapThucDonTuanToiDTO();

                row.Add(TableColumnMapping.MaCTPLTDTT, dr[TableColumnMapping.MaCTPLTDTT].ToString());
                row.Add(TableColumnMapping.MaPLTDTT, dr[TableColumnMapping.MaPLTDTT].ToString());
                row.Add(TableColumnMapping.MaTD, dr[TableColumnMapping.MaTD].ToString());
                row.Add(TableColumnMapping.TenTD, dr[TableColumnMapping.TenTD].ToString());
                row.Add(TableColumnMapping.SOLUONG, dr[TableColumnMapping.SOLUONG].ToString());

                // Add to list
                Lst_ChiTietPhieuLapThucDonTuanToi.Add(row);
            }


            dbms.Disconnect();

            return Lst_ChiTietPhieuLapThucDonTuanToi;
        }

        /*
       /// <summary>
       /// Lay_ChiTietPhieuLapThucDonTuanToi
       /// </summary>
       /// <param name="parameters"></param>
       /// <returns>ChiTietPhieuLapThucDonTuanToiDTO</returns>
       public static List<ChiTietPhieuLapThucDonTuanToiDTO> Lay_DanhSach_LstObj_ChiTietPhieuLapThucDonTuanToi(List<SqlParameter> parameters)
       {
           DBMS dbms = new DBMS();
           dbms.Connect();

           ChiTietPhieuLapThucDonTuanToiDTO ctpltdtt;

           DataTable dt = dbms.ExcuteProcedure_Select_DataTable(StoreProcedureConstant.SP_SELECT_CHI_TIET_PHIEU_LAP_TD_TUAN_TOI, parameters.ToArray());

           List<ChiTietPhieuLapThucDonTuanToiDTO> Lst_ChiTietPhieuLapThucDonTuanToi = new List<ChiTietPhieuLapThucDonTuanToiDTO>();

           for (int i = 0; i < dt.Rows.Count; i++)
           {
               DataRow dr = dt.Rows[i];

               ctpltdtt = new ChiTietPhieuLapThucDonTuanToiDTO();

               ctpltdtt.MaCTPLTDTT = dr["MaCTPLTDTT"].ToString();
               ctpltdtt.MaPLTDTT = dr["MaPLTDTT"].ToString();
               ctpltdtt.MaTD = dr["MaTD"].ToString();
               ctpltdtt.SoLuong = dr["SoLuong"].ToString();

               // Add to list
               Lst_ChiTietPhieuLapThucDonTuanToi.Add(ctpltdtt);
           }
            

           dbms.Disconnect();

           return Lst_ChiTietPhieuLapThucDonTuanToi;
       }

       /// <summary>
       /// Lay_DanhSach_ChiTietPhieuLapThucDonTuanToi
       /// </summary>
       /// <param name="parameters"></param>
       /// <returns>List<ArrayList></returns>
       public static List<ArrayList> Lay_DanhSach_LstArr_ChiTietPhieuLapThucDonTuanToi(List<SqlParameter> parameters)
       {
           DBMS dbms = new DBMS();
           dbms.Connect();

           ChiTietPhieuLapThucDonTuanToiDTO ctpltdtt;

           DataTable dt = dbms.ExcuteProcedure_Select_DataTable(StoreProcedureConstant.SP_SELECT_CHI_TIET_PHIEU_LAP_TD_TUAN_TOI, parameters.ToArray());

           List<ArrayList> Lst_ChiTietPhieuLapThucDonTuanToi = new List<ArrayList>();

           for (int i = 0; i < dt.Rows.Count; i++)
           {
               DataRow dr = dt.Rows[i];
               ArrayList row = new ArrayList();
               ctpltdtt = new ChiTietPhieuLapThucDonTuanToiDTO();

               row.Add(dr["MaCTPLTDTT"]);
               row.Add(dr["MaPLTDTT"]);
               row.Add(dr["MaTD"]);
               row.Add(dr["SoLuong"]);

               // Add to list
               Lst_ChiTietPhieuLapThucDonTuanToi.Add(row);
           }


           dbms.Disconnect();

           return Lst_ChiTietPhieuLapThucDonTuanToi;
       } */ 
        #endregion


        #region Insert
        /// <summary>
        /// Them_ChiTietPhieuLapThucDonToi
        /// </summary>
        /// <param name="parameters"></param>
        /// <returns>int : 0 -> OK </returns>
        public static int Them_ChiTietPhieuLapThucDonToi(List<List<SqlParameter>> parameters)
        {
            DBMS dbms = new DBMS();
            dbms.Connect();

            int result = 0;

            for (int i = 0; i < parameters.Count; i++)
            {
                List<SqlParameter> param = parameters.ElementAt(i);
                
                // @MaCTPLTDTT, @MaPLTDTT, @MaTD, @SoLuong
                result = dbms.ExcuteProcedure_InsertUpdateDelete_Int(StoreProcedureConstant.SP_INSERT_CHI_TIET_PHIEU_LAP_TD_TUAN_TOI, param.ToArray());

            }

            dbms.Disconnect();

            return result;
        }
        #endregion

        #region Update
        public static int CapNhat_ChiTietPhieuLapThucDonToi(List<List<SqlParameter>> parameters, string ParentID, string[] MainKeys)
        {
            DBMS dbms = new DBMS();
            dbms.Connect();

            int result = 0;
            int AddCaseRes = 0;
            int DeleteCaseRes = 0;
            int CompleteAdd = 0;

            /*
             *  Bước 1: Kiểm tra List<List<SqlParameter>> parameters rỗng hay không
             *  1. Trường hợp ban đầu khởi tạo grid không có dữ liệu
             *  2. Trường hợp ban đầu grid có dữ liệu, user xóa đi hết
             */


            List<SqlParameter> param = new List<SqlParameter>();
            param.Add(new SqlParameter(ParameterConstant.MaPLTDTT, ParentID));


            // Lấy danh sách: @MaPLTDTT
            List<Dictionary<string, string>> LstObj = ChiTietPhieuLapThucDonTuanToiDAO.Lay_DanhSach_LstDic_ChiTietPhieuLapThucDonTuanToi(param);

            if (parameters == null) // trên grid không có data
            {
                /*
                 *  Bước 1.1: Tìm trong bảng CHI_TIET_PHIEU_LAP_TD_TUAN_TOI với tham số là @MaPLTDTT có dữ liệu hay không
                 *  1. Nếu có: Xóa sạch nhưng dòng có trị = @MaPLTDTT
                 */

                if (LstObj != null) // mà trong db có -> đã xóa hết data trên grid
                {
                    List<SqlParameter> DeleteParams = new List<SqlParameter>();
                    DeleteParams.Add(new SqlParameter(ParameterConstant.MaPLTDTT, ParentID));

                    DeleteCaseRes = ChiTietPhieuLapThucDonTuanToiDAO.Delete_ChiTietPhieuLapThucDonToi(DeleteParams);
                }
            }
            else // trên grid có data
            {
                /*
                 *  Bước 2: List<List<SqlParameter>> parameters KHONG rỗng thì cập nhật từng dòng dữ liệu
                 *  2.1: Trường hợp trên grid thêm dòng trên grid: 
                 *  2.2. Trường hợp trên grid xóa dòng trên grid: 
                 */

                if (LstObj.Count == 0) //trên grid có mà db không có
                {
                    // Thêm mới hoàn toàn

                    // Trên grid có cột ẩn MaPLTDTT, nên phải cập nhật tham số
                    List<List<SqlParameter>> CTPLTDTTparams = SqlParameterUitl.Update_SqlParameter_For_ListSqlParameter(parameters, ParameterConstant.MaPLTDTT, ParentID);

                    CompleteAdd = Them_ChiTietPhieuLapThucDonToi(CTPLTDTTparams);

                }
                else //trên grid có , db cũng có
                {
                    if (parameters.Count >= LstObj.Count) // chắc chắn là thêm vào trong grid
                    {
                        AddCaseRes = BLogicAction.Update_Case_AddRow(parameters, LstObj, MainKeys);
                    }
                    else if (parameters.Count < LstObj.Count) // chắc chắn là xóa đi trên grid
                    {
                        DeleteCaseRes = BLogicAction.Update_Case_DeleteRow(parameters, LstObj, MainKeys);
                    }
                }
                
                
            }
            
            // Kiểm tra kết quả thực thi
            if ((AddCaseRes != 0) || (DeleteCaseRes != 0) || (CompleteAdd !=0 ))
            {
                result = -1;
            }

            dbms.Disconnect();

            return result;
        }
        #endregion


        #region Delete
        public static int Delete_ChiTietPhieuLapThucDonToi(List<SqlParameter> parameters)
        {
            DBMS dbms = new DBMS();
            dbms.Connect();

            int result = dbms.ExcuteProcedure_InsertUpdateDelete_Int(StoreProcedureConstant.SP_DELETE_CHI_TIET_PHIEU_LAP_TD_TUAN_TOI, parameters.ToArray());

            dbms.Disconnect();

            return result;
        }

        public static int DeleteAll_ChiTietPhieuLapThucDonToi(List<List<SqlParameter>> parameters)
        {
            DBMS dbms = new DBMS();
            dbms.Connect();

            int result = 0;

            foreach (var item in parameters)
            {
                result = dbms.ExcuteProcedure_InsertUpdateDelete_Int(StoreProcedureConstant.SP_DELETE_CHI_TIET_PHIEU_LAP_TD_TUAN_TOI, item.ToArray());
            }
            
            dbms.Disconnect();

            return result;
        }
        #endregion

        #region Count
        public static int Count_ThucDon_Trong_ChiTietPhieuLapThucDonToi(List<SqlParameter> parameters)
        {
            DBMS dbms = new DBMS();
            dbms.Connect();

            int result = dbms.ExcuteProcedure_Count(StoreProcedureConstant.SP_COUNT_THUCDON_CHI_TIET_PHIEU_LAP_TD_TUAN_TOI, parameters.ToArray());

            dbms.Disconnect();

            return result;
        }
        #endregion

    }
}
